package com.qiangzhi.valid;

import com.qiangzhi.annotation.IntegerField;
import com.qiangzhi.constant.DefaultDataConstant;
import com.qiangzhi.constant.RegexConstant;
import com.qiangzhi.constant.StatusConstant;
import com.qiangzhi.enums.IntegerFieldType;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.List;

/**
 * IntegerField注解具体校验逻辑的实现类
 */
public class IntegerFieldValid implements ConstraintValidator<IntegerField, Integer> {

    // 静态集合 集合中存放了所有状态参数用于校验
    static List<Integer> statusList = Arrays.asList(StatusConstant.ENABLE, StatusConstant.DISABLE);

    private IntegerFieldType fieldType; // 字段类型
    private boolean isEmpty; // 是否可以为空

    /**
     * 获取到使用注解时设置的约束
     *
     * @param constraintAnnotation 可以获取到注解设置的约束
     */
    @Override
    public void initialize(IntegerField constraintAnnotation) {
        this.fieldType = constraintAnnotation.type();
        this.isEmpty = constraintAnnotation.empty();
    }

    /**
     * 具体校验逻辑
     *
     * @param field                      需要检验的字段
     * @param constraintValidatorContext 校验结果的提示信息 使用注解时已经指明了错误提示信息 一般不需要使用
     * @return 校验成功或失败
     */
    @Override
    public boolean isValid(Integer field, ConstraintValidatorContext constraintValidatorContext) {
        String value = String.valueOf(field); // 需要先将Integer转为String才能进行正则校验

        // 参数可以为空 进行空字符串校验
        if (isEmpty) {
            // 空字符串校验
            return DefaultDataConstant.DEFAULT_EMPTY_STRING.equals(value) || value.isEmpty();
        }

        // 学院号参数校验
        if (fieldType == IntegerFieldType.COLLEGE_ID) return value.matches(RegexConstant.COLLEGE_ID_REGEX);

        // 班级号参数校验
        if (fieldType == IntegerFieldType.MAJOR_ID) return value.matches(RegexConstant.MAJOR_ID_REGEX);

        // 状态参数校验
        if (fieldType == IntegerFieldType.STATUS) return statusList.contains(field);

        return false;
    }

}
